package design_pattern.trigger.frame;

import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

/**
 * 事件分发中心
 * 本质上是 观察者 实现了 Observer 观察者接口
 * 具体的观察者逻辑： 注册观察者（这里使用具体事件消费者来进行替代）
 * 用于update具体的事件，处理相应的逻辑
 */
public class EventDispatch implements Observer {
    // 单例模式
    private final static EventDispatch dispatch = new EventDispatch();
    // 事件消费者
    private Vector<AbstractEventConsumer> customers = new Vector<AbstractEventConsumer>();

    // 不允许生成新的实例
    private EventDispatch() {
    }

    // 获得单例对象
    public static EventDispatch getDispatch() {
        return dispatch;
    }

    // 事件触发
    public void update(Observable o, Object object) {
        System.out.println("这里定义事件触发的效果");
        // 事件源头
        Product product = (Product) object;
        // 事件
        ProductEvent event = (ProductEvent) o;
        // 处理者处理，这里是中介模式的核心，可以是很复杂的业务逻辑
        for (AbstractEventConsumer e : customers) {
            //处理能力是否匹配
            for (EventConsumerType ect : e.getCustomTypeVector()) {
                if (ect.getValue() == event.getEventType().getValue()) {
                    e.exec(event);//执行处理事件
                }
            }
        }
    }

    // 注册客户端
    public void registerCustomer(AbstractEventConsumer customer) {
        customers.add(customer);
    }

}

